/**
 * @description shared controller
 */
const path = require('path')
const fse  = require('fs-extra')
const { UPLOAD_FOLDER_ROOT, UPLOAD_TYPES } = require('../conf/constants')
const { SuccessModel, ErrorModel } = require('../model/ResModel')
const { uploadFileSizeFailInfo, uploadTypeFailInfo } = require('../model/ErrorInfo')

const MAX_FILE_SIZE = 800 * 1024 // 文件上传的大小限制：800kb

// 初始化创建各文件目录
UPLOAD_TYPES.forEach(UPLOAD_TYPE => {
  const distFolderPath = path.join(UPLOAD_FOLDER_ROOT, UPLOAD_TYPE)
  fse.pathExists(distFolderPath).then(isExist => {
    if (!isExist) {
      fse.ensureDir(distFolderPath) // 创建文件目录
    }
  })
})

/**
* 保存文件到指定路径
* @param {string} type 文件类型
* @param {string} name 文件名
* @param {string} filePath 文件路径
* @param {number} size 文件体积大小 
*/
async function saveFile({ type, name, filePath, size }, uploadType) {
  // 传参校验
  if (!UPLOAD_TYPES.includes(uploadType)) {
    return new ErrorModel(uploadTypeFailInfo)
  }

  if (size > MAX_FILE_SIZE) {
    // 先将体积过大的文件从服务器硬盘上删除
    await fse.remove(filePath)
    // 然后再返回错误信息
    return new ErrorModel(uploadFileSizeFailInfo)
  }

  // 移动文件（如果是第三方文件服务就调用其 API，然后得到文件 URL）
  const distFolderPath = path.join(UPLOAD_FOLDER_ROOT, uploadType) // 上传文件的输出目录地址
  const fileName = `${Date.now()}.${name}` // 防止同名文件覆盖
  const distFilePath = path.join(distFolderPath, fileName) // 文件移动的目的地地址
  await fse.move(filePath, distFilePath) // 将文件从原始地址移动到目的地地址

  // 返回信息
  return new SuccessModel({ url: `/${uploadType}/${fileName}` })
}

module.exports = {
  saveFile,
}
